#include <iostream>

// // 2

// class Test
// {
// public:
//     Test()
//     {
//         std::cout << "构造函数\n";
//     }
//     ~Test()
//     {
//         std::cout << "析构函数\n";
//     }
// };

// class Derived : public Test
// {
// };

// void func()
// {
//     // throw Test();

//     // Test t;     // 栈的解旋：函数栈上的临时对象会在抛出异常前全部释放
//     // throw 1; //

//     throw Derived();
// }

// int main()
// {
//     try
//     {
//         func();
//     }
//     // catch(const int& t)   // 捕获的对象会在catch之后释放
//     // {
//     //     std::cout<<"error\n";
//     // }

//     // 支持向上转型
//     // catch (const Test &t)
//     // {
//     //     std::cout << "error\n";
//     // }

//     // 当多个分支都能捕获时，按顺序捕获
//     catch (const Test &t)
//     {
//         std::cout << "Test\n";
//     }
//     catch (const Derived &t)
//     {
//         std::cout << "Derived\n";
//     }

//     return 0;
// }

class Test
{
public:
    Test(){std::cout << "构造函数\n";}
    ~Test(){std::cout << "析构函数\n";}
};
class Derived : public Test 
{};
void func()
{
    throw Derived();
}
int main()
{
    try{func();}
    catch (const Test &t){std::cout << "error\n";}
    return 0;
}
